/**
 * CLASSE ListagemEventosProcessos
 *
 * Esta classe contem a implementacao do acesso ao arquivo CSV de eventos de processos de cada cliente e a
 * implementacao das operacoes de consulta e insercao no cadastro de eventos de processos. Enfim, todas as
 * operacoes relativas ao conjunto de eventos de processos de um cliente do sistema estao implementadas aqui.
 */

//-------------------------------------------------------------------
// I M P O R T A C A O   D E   C L A S S E S   D A   A P I   J A V A
//-------------------------------------------------------------------

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Vector;

/**
 * Inicio da especificacao da classe.
 */
public class ListagemEventosProcessos {

//------------------------------------------------------
// M E T O D O S
//------------------------------------------------------

	/**
	 * METODO incluirEvento
	 *		Adiciona um novo registro de evento ao cadastro. Os dados desse evento devem ser passados ao
	 * metodo dentro de um objeto da classe EventoProcesso. 
	 */
	public void incluirEvento(EventoProcesso evento) {
		try {
		
			FileWriter fw = new FileWriter("eventos.csv", true);
			BufferedWriter arq = new BufferedWriter(fw);
			
			arq.write(evento.numeroProcesso + ";" + 
					  evento.dataHora.geraStringBarras() + ";" +
				      evento.descricao);
			arq.newLine();
			
			arq.close();
			
		} catch(IOException e) {
			System.out.println("Erro ao tentar gravar as linhas do arquivo \"eventos.csv\".");
			
		}
	} // Fim do metodo "incluirEvento".
	
	/**
	 * METODO analisaLinha
	 *		Cria um objeto da classe EventoProcesso contendo os dados do evento contidos em uma linha do arquivo
	 * CSV de eventos, passada no parametro como um String.
	 */
	public EventoProcesso analisaLinha(String linha) {
		String[] dados = linha.split(";");
		EventoProcesso e = new EventoProcesso();
		e.numeroProcesso = Integer.parseInt(dados[0].trim());
		e.dataHora = new DataHora(dados[1].trim());
		e.descricao = dados[2].trim();
		return e;
	} // Fim do metodo "analisaLinha"
	
	/**
	 * METODO consultaPorMes
	 *		Retorna todos os eventos armazenados no objeto que ocorrem no mes especificado nos parametros.
	 * Os dados dos eventos serao retornados em um vetor de objetos da classe EventoProcesso.
	 */
	public EventoProcesso[] consultaPorMes(int mes, int ano) {
		Vector<EventoProcesso> result = new Vector<EventoProcesso>();
		
		// Veremos o que eh a estrutura try...catch mais adiante na disciplina.
		try {
		
			FileReader fr = new FileReader("eventos.csv");
			BufferedReader arq = new BufferedReader(fr);
			
			String linha = arq.readLine();
			while(linha != null) {
				if(linha.trim().length() > 0) {
					EventoProcesso e = analisaLinha(linha);
					if(e.dataHora.mes == mes && e.dataHora.ano == ano)
						result.add(e);
				}
				linha = arq.readLine();
			}	
			arq.close();
		} catch(FileNotFoundException e) {
			System.out.println("O arquivo de eventos (\"eventos.csv\") nao foi encontrado!");
		} catch(IOException e) {
			System.out.println("Erro ao tentar ler as linhas do arquivo \"eventos.csv\".");
		} // Fim da estrutura try...catch iniciada na linha 77.
		
		return result.toArray(new EventoProcesso[0]);
	} // Fim do metodo "consultaPorMes".
	
	/**
	 * METODO consultaPorProcesso
	 *		Retorna todos os eventos de um processo, dentro de um vetor de objetos da classe EventoProcesso.
	 */
	public EventoProcesso[] consultaPorProcesso(int numProcesso) {
		Vector<EventoProcesso> result = new Vector<EventoProcesso>();
		
		// Veremos o que eh a estrutura try...catch mais adiante na disciplina.
		try {
		
			FileReader fr = new FileReader("eventos.csv");
			BufferedReader arq = new BufferedReader(fr);
			
			String linha = arq.readLine();
			while(linha != null) {
				if(linha.trim().length() > 0) {
					EventoProcesso e = analisaLinha(linha);
					if(e.numeroProcesso == numProcesso)
						result.add(e);
				}
				linha = arq.readLine();
			}	
			arq.close();
		} catch(FileNotFoundException e) {
			System.out.println("O arquivo de eventos (\"eventos.csv\") nao foi encontrado!");
		} catch(IOException e) {
			System.out.println("Erro ao tentar ler as linhas do arquivo \"eventos.csv\".");
		} // Fim da estrutura try...catch iniciada na linha 109.
		
		return result.toArray(new EventoProcesso[0]);
	} // Fim do metodo "consultaPorProcesso".
	
} // Fim da classe "ListagemEventosProcessos".